import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

/**
 * 利用class对象获取构造方法
 */
public class ReflexDemo2 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("Student");

        // 获取构造方法
        // 获取所有公共构造方法
        Constructor[] constructors = clazz.getConstructors();
        System.out.println(constructors);
        // 获取单个公共构造方法
        Constructor constructor = clazz.getConstructor(String.class);
        System.out.println(constructor);
        // 获取全部构造方法【私有+公有】
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        System.out.println(declaredConstructors);
        // 获取某个构造方法
        Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);
        System.out.println(declaredConstructor);

        // 获取修饰符：每个修饰符对应着一个数字
        int modifiers = declaredConstructor.getModifiers();
        System.out.println(modifiers);

        // 获取构造方法的参数
        Parameter[] parameters = declaredConstructor.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        // 使用构造方法创建对象
        // 暴力反射：临时取消权限校验
        declaredConstructor.setAccessible(true);
        Student jixer = (Student) declaredConstructor.newInstance("Jixer", 12);
        System.out.println(jixer);


    }
}
